package com.davidlife.jvm.gc.softref;

import java.lang.ref.SoftReference;

//Run this class using JVM args: -Xmx10m
public class SoftRef {
    public static class User {
        public int id;
        public String name;

        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {
        User user = new User(1, "Tom");
        SoftReference userSoftRef = new SoftReference<>(user);
        user = null;  //去除强引用

        System.out.println("Before GC");
        System.out.println(userSoftRef.get());
        System.gc();
        System.out.println("After First GC");
        System.out.println(userSoftRef.get());

        //要调节这个数，当堆空间正好不够分配这个byte[]，但是清空软引用对象后就够了，才会发生第二次GC后userSoftRef.get()为null的情况
        byte[] bytes = new byte[1024 * 938 * 7];
        System.gc(); //这里其实不用再调用System.gc()，因为在分配大数据时，系统会自动进行GC，这里只是为了更清楚说明问题。
        System.out.println("After second GC");
        System.out.println(userSoftRef.get());
    }
}
/**
一种可能的输出情况：
 Before GC
 User{id=1, name='Tom'}
 After First GC
 User{id=1, name='Tom'}
 After second GC
 null
 */
